/**
 * 
 */
package jmine.tec.utils.cripto.key;

import java.io.FileOutputStream;
import java.io.IOException;
import java.security.Key;
import java.security.KeyPair;

/**
 * @author takeshi
 * @version 11/12/2007
 */
public class GeradorArquivoChaves {

    /**
     * 
     */
    private static final int NUM3 = 3;

    private final int tamanho;

    private final String chavePublica, chavePrivada;

    /**
     * C'tor
     * 
     * @param tamanho tamanho da chave
     * @param chavePublica o arquivo que contera a chave publica
     * @param chavePrivada o arquivo que contera a chave privada
     */
    public GeradorArquivoChaves(final int tamanho, final String chavePublica, final String chavePrivada) {
        super();
        this.tamanho = tamanho;
        this.chavePublica = chavePublica;
        this.chavePrivada = chavePrivada;
    }

    /**
     * @throws IOException e
     */
    public void gera() throws IOException {
        KeyPair par = GeradorChaveRSA.geraParChavesRSA(this.tamanho);
        final Key key = par.getPublic();
        final String fileName = this.chavePublica;
        this.salvaChave(key, fileName);
        this.salvaChave(par.getPrivate(), this.chavePrivada);
    }

    /**
     * Grava a chave dada no arquivo passado
     * 
     * @param key a chave
     * @param fileName o caminho completo do arquivo
     * @throws IOException se houver uma excecao ao gravar no arquivo
     */
    private void salvaChave(final Key key, final String fileName) throws IOException {
        byte[] encoded = key.getEncoded();
        FileOutputStream fout = new FileOutputStream(fileName);
        try {
            fout.write(encoded);
            fout.flush();
        } finally {
            if (fout != null) {
                fout.close();
            }
        }
    }

    /**
     * @param args os argumentos
     */
    public static void main(final String[] args) {
        if (args.length != NUM3) {
            System.out.println("Uso: java GeradorArquivoChave " + "<tamanho> " + "<arquivo de chave publica> "
                    + "<arquivo de chave privada>");
            System.exit(1);
        }
        int tamanho = Integer.parseInt(args[0]);
        try {
            new GeradorArquivoChaves(tamanho, args[1], args[2]).gera();
            System.out.println("Chaves geradas com sucesso");
        } catch (IOException e) {
            e.printStackTrace();
            System.err.println("houve um erro ao salvar o arquivo");
            System.exit(-1);
        }
    }

}
